package com.itheima.health.config;

import com.itheima.health.common.RedisConst;
import com.itheima.health.service.SetMealService;
import com.itheima.health.util.QiniuUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.Count;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @author ：spice
 * @date ：Created in 2022年08月01日
 * @description ：清理垃圾图片
 * @version: 1.0
 */
@Component
@Slf4j
public class ClearImgJob {
    //测试用
    /*private static final Long MIN_DELETE_WAIT_TIME = 10L;*/
    //清理前的最小等待时间，设置为10分钟
    private static final Long MIN_DELETE_WAIT_TIME = 10 * 60 * 1000L;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private SetMealService setMealService;
    @Autowired
    private QiniuUtils qiniuUtils;

    //当我们的清理垃圾图片程序出错时，用Quartz提供的JobExecutionException类相关方法就能很好的解决
   //@Scheduled(cron = "0 */1 * * * ?")//每隔1分钟执行一次
    @Scheduled(cron = "0 0 4 * * ?")//每天凌晨4点进行垃圾图片删除
    public void clearImg() throws JobExecutionException {
        log.info("开始清理垃圾图片......");
        //获取redis中保存的图片名集合
        Set<String> set = redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).members();
        //遍历该集合，获取每一个图片名
        for (String img : set) {
            try {
                log.info("[图片名为]:{}", img);
                //截取该图片的创建时间毫秒值，用来判断
                Long createTime = Long.valueOf(img.split("_", 2)[0]);
                //清理前，判断图片是否为最近10分钟内提交的，如果是，就跳过该次删除，防止用户表单未提交正在填写，图片就被删除了
                if ((System.currentTimeMillis() - createTime) <MIN_DELETE_WAIT_TIME){
                    log.info("[清理垃圾图片]清理的图片小于最小等待时间，暂不清理:{}"+img);
                    continue;
                }
                //判断图片是否被使用
                Long count=setMealService.countByImg(img);
                //如果数量为0，说明数据库中没有，是垃圾图片
                if(count==0){
                    //先从七牛云删除
                    log.info("[清理垃圾图片]:{}",img);
                    qiniuUtils.deleteFileFromQiniu(img);
                    //redis也要删除
                    redisTemplate.boundSetOps(RedisConst.SETMEAL_PIC_RESOURCES).remove(img);
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
                JobExecutionException e2= new JobExecutionException(e);
                // 这个工作将立即重新开始
                e2.setRefireImmediately(true);
                throw e2;
            }

        }
    }
}
